package com.yuanzi.base.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yuanzi.base.constants.BaseConstants;

/**
 * 返回结果工具类
 * 
 * @author chengshx
 * @date 2017年5月8日
 */
public class ResultUtils {
	
	/**
	 * 适用于只返回code
	 * 
	 * @author chengshx
	 * @param code 错误码
	 * @return
	 */
	public static JSONObject getResult(Object code) {
		JSONObject objResult = new JSONObject();
		objResult.put(BaseConstants.CODE, code);
		return objResult;
	}
	
	/**
	 * 默认200的code
	 * @author chengshx
	 * @date 2017年7月18日
	 *
	 * @return
	 */
	public static JSONObject getResult() {
		return getResult(BaseConstants.SUCCESS);
	}
	
	/**
	 * 适用于返回code和msg
	 * 
	 * @author chengshx
	 * @param code 错误码
	 * @param msg 错误提示
	 * @return
	 */
	public static JSONObject getResult(Object code, String msg) {
		JSONObject objResult = getResult(code);
		objResult.put(BaseConstants.MSG, msg);
		return objResult;
	}
	
	/**
	 * 适用于只返回code和提示参数
	 * 
	 * @author chengshx
	 * @param code 错误码
	 * @param prompt 提示参数
	 * @return
	 */
	public static JSONObject getResult(Object code, Object[] prompt) {
		JSONObject objResult = getResult(code);
		if (prompt != null) {
			objResult.put(BaseConstants.PROMPT, prompt);
		}
		return objResult;
	}
	
	/**
	 * 适用于返回code和msg
	 * 
	 * @author chengshx
	 * @param code 错误码
	 * @param msg 错误提示
	 * @param prompt 提示参数
	 * @return
	 */
	public static JSONObject getResult(Object code, String msg, Object[] prompt) {
		JSONObject objResult = getResult(code, prompt);
		objResult.put(BaseConstants.MSG, msg);
		return objResult;
	}
	
	/**
	 * 适用于将实体对象的属性直接返回
	 * @author chengshx
	 * @date 2017年7月1日
	 *
	 * @param code
	 * @param obj 实体对象
	 * @return
	 */
	public static JSONObject getResult(Object code, Object obj) {
		JSONObject objResult = getResult(code);
		objResult.putAll((JSONObject)JSON.toJSON(obj));
		return objResult;
	}

	/**
	 * 适用于返回结果是数组
	 * 
	 * @author chengshx
	 * @param code 错误码
	 * @param arrayName 结果数组名字
	 * @param array 结果返回数组
	 * @return
	 */
	public static JSONObject getResult(Object code, String arrayName, JSONArray array) {
		JSONObject objResult = getResult(code);
		objResult.put(arrayName, array);
		return objResult;
	}


	
	/**
	 * 适用于分页结果返回
	 * @author chengshx
	 * @date 2017年6月23日
	 *
	 * @param code 错误码
	 * @param returnCount 总条数
	 * @param allPage 总页数
	 * @param currentPage 当前页
	 * @param arrayName 结果数组名字
	 * @param array 结果返回数组
	 * @return
	 */
	public static JSONObject getResult(Object code, Long returnCount, Integer allPage, Integer currentPage, String arrayName, JSONArray array) {
		JSONObject objResult = getResult(code, arrayName, array);
		objResult.put("returnCount", returnCount);
		objResult.put("allPage", allPage);
		objResult.put("currentPage", currentPage);
		return objResult;
	}
	
	/**
	 * 请求降级返回
	 * @author chengshx
	 * @date 2017年8月3日
	 *
	 * @param e Hystrix异常对象
	 * @return
	 */
	public static JSONObject getFallback(Throwable e) {
		LogUtils.error(e.getClass(), "", e);
		return ResultUtils.getResult(BaseConstants.FAILED, new Object[]{e.getMessage(), e.getStackTrace()[0]});
	}
	
}
